perm filename UDPEDT.FAI[KID,KMC] blob
sn#122898 filedate 1974-11-15 generic text, type T, neo UTF8
TITLE UDPEDT; THIS PROGRAM ALTERS THE UDP DIRECTORY BY OVERWRITING
; NOMINATED WORDS ACCORDING TO A PRESCRIPTION GIVEN IN
; THE TABLE 'EDITS'.
;
; RECALL THAT THE DIRECTORY OCCUPIES 1 BLOCK AND THIS
; HAS BLOCK NUMBER GIVEN BY `PAKST'.
;
; RECALL ALSO THAT THE FORMAT OF THE UDP DIRECTORY IS :-
; WORD 0 - NUMBER OF ENTRIES;
; WORD 1 - DATE OF LAST CHANGE ON UDP;
; WORD 2 - NEXT FREE BLOCK NUMBER;
; WORD 3 - JUNK
; WORD (2N+2) - NAME OF nTH ENTRY;
; WORD (2N+3)LO - BLOCK ADDRESS OF nTH ENTRY;
; WORD (2N+3)HI - LENGTH (WORDS) OF nTH ENTRY.
;
; EACH EDIT SPECIFICATION IS A TRIPLET OF WORDS:-
; THE FIRST IS THE ADDRESS OF THE WORD TO BE CHANGED;
; THE SECOND IS THE OLD CONTENTS OF THE WORD;
; THE THIRD IS THE NEW CONTENTS OF THE WORD.
;
; THIS PROGRAM CAN ONLY BE USED TO EDIT WORDS IN THE
; DIRECTORY BLOCK OF A UDP AND WILL ONLY DO SO IF
; ALL THE SPECIFICATIONS OF `OLD CONTENTS' PROVE CORRECT.
;
; AS AN ADDITIONAL CHECK THE USER MUST DECLARE THE NUMBER
; OF TRIPLETS HE INTENDS TO SUPPLY.
;
; ONLY CHANGE A COPY OF THIS PROGRAM.
;
; THE PROGRAM ALTERS WORD 1 TO CURRENT DATE BEFORE
; ANY OTHER WORD IN DIRECTORY IS CHANGED.
;
A ← 1
B ← 2
C ← 3
CPLUS1 ← 4
D ← 5
P ← 6
ABY3 ←7
UDPCHN ←← 1
PAKST ←← 1
DIRECT: BLOCK =2336
PDL: BLOCK =10
FAILS: 0 ;SET NONZERO BY FAILURES.
EDITS:
;DECLARE THE TRIPLETS HERE.
EDEND: 0
NUMBER: 0 ;YOU MUST CHANGE THIS TOO.
START: ;START BY INITing THE UDP
INIT UDPCHN,17
SIXBIT /UDP/
0
JRST [OUTSTR [ASCIZ /CANNOT INIT UDP/]
CALL [SIXBIT /EXIT/]]
ENTER UDPCHN,[SIXBIT /KMC/
0
0
0]
JRST [OUTSTR [ASCIZ /CURRENT PAK PROTECTED/]
CALL [SIXBIT /EXIT/]]
MOVE P,[IOWD 5,PDL]
MOVEI A,EDEND-EDITS
CAIN A,0 ;TEST FOR EDEND=EDITS
JRST [OUTSTR [ASCIZ /YOU MISPLACED YOUR EDIT TRIPLETS/]
CALL [SIXBIT /EXIT/]]
SKIPN NUMBER ;TEST NUMBER
JRST [OUTSTR [ASCIZ /YOU DID NOT CHANGE NUMBER/]
CALL [SIXBIT /EXIT/]]
MOVE A,NUMBER ;NUMBER OF WORDS TO CHANGE
IMULI A,3
CAIE A,EDEND-EDITS ;TEST NUMBER FOR CORRECTNESS.
JRST [OUTSTR [ASCIZ /COUNT YOUR EDITS AGAIN/]
CALL [SIXBIT /EXIT/]]
;NOW READ THE UDP DIRECTORY BLOCK.
IN UDPCHN,[IOWD =2336,DIRECT
PAKST]
JRST .+2
JRST [OUTSTR [ASCIZ /ERROR ON READING UDP/]
CALL [SIXBIT /EXIT/]]
CALL A,[SIXBIT /DATE/]
MOVE A,DIRECT+1 ;UPDATE THE DATE
MOVEI A,0 ;PREPARE TO LOOP
MOVEI ABY3,0
LOOP: ;THIS IS THE START OF THE MAIN LOOP
CAMN A,NUMBER
JRST LOOPX ;ESCAPE LOOP
MOVE B,EDITS(ABY3) ;WORD 1 OF TRIPLET - ADDRESS.
CAIGE B,0 ;TEST FOR NEG ADDR.
JRST [MOVEI B,[ASCIZ /WORD 1 NEGATIVE./]
JRST ALLFAILS]
CAIL B,=2336 ;TEST FOR ADDRESS BEYOND 1 BLOCK
JRST [MOVEI B,[ASCIZ /WORD 1 TOO LARGE./]
JRST ALLFAILS]
MOVE C,EDITS+1(ABY3) ;PREDICTED OLD CONTENTS.
CAME C,DIRECT(B) ;CHECK OLD CONTENTS
JRST [MOVEI B,[ASCIZ /OLD CONTENTS NOT AS PREDICTED./]
JRST ALLFAILS]
MOVE C,EDITS+2(ABY3) ;PRESCRIBED NEW CONTENTS.
MOVEM C,DIRECT(B) ;MAKE THE CHANGE
QWERTY: ADDI A,1 ;BUMP LOOP COUNTER
ADDI ABY3,3 ;ADJUST THIS TOO
JRST LOOP
ALLFAILS:;A FAILURE HAS BEEN DETECTED IN A TRIPLET.
OUTSTR [ASCIZ /A FAILURE WAS DETECTED IN TRIPLET /]
MOVE C,A ;COPY TRIPLET NUMBER
MOVEI D,=1000
CAIL C,=1000 ;PRINT NO THSDS DGT IF 0
PUSHJ P,DIGIT ;PRINT THOUSANDS
MOVEI D,=100
PUSHJ P,DIGIT ;PRINT HUNDREDS
MOVEI D,=10
PUSHJ P,DIGIT ;PRINT TENS
MOVEI D,=1
PUSHJ P,DIGIT ;PRINT UNITS
MOVEI C,12
OUTCHR C ;PUT OUT A LF CHAR.
MOVEI C,15
OUTCHR C ;PUT OUT A CR CHAR.
HRRM B,.+1
OUTSTR 0 ;VARIOUS MESSAGES
MOVEI C,12
OUTCHR C ;PUT OUT A LF CHAR.
MOVEI C,15
OUTCHR C ;PUT OUT A CR CHAR.
SETOM FAILS ;RECORD FACT OF ERRORS.
JRST QWERTY
LOOPX: ;THE LOOP FINISHED
SKIPE FAILS ;JUMP IF NO FAILURES
JRST [OUTSTR [ASCIZ /DIRECTORY NOT REWRITTEN (FAILURES)./]
CALL [SIXBIT /EXIT/]]
OUT UDPCHN,[IOWD =2336,DIRECT
PAKST]
JRST .+2
JRST [OUTSTR [ASCIZ /ERROR ON UDP WRITE/]
CALL [SIXBIT /EXIT/]]
RELEAS UDPCHN
CALL [SIXBIT /EXIT/]
DIGIT: ;THIS S/R IS TO MAKE INTEGER PRINTING EASY
;IT PRINTS THE DIGIT OF THE NMBER IN C CORRESPONDING
;TO THE RADIX GIVEN IN D AND REMOVES THE DIGIT FROM C.
;THE ROUTINE USES REGISTER CPLUS1 FOR DIVISIONS (CPLUS1=C+1).
IDIV C,D ;GET QUOT AND REMNDR.
ADDI C,060 ;CONVERT TO DIGIT
OUTCHR C ;PRINT DIGIT
MOVE C,CPLUS1 ;THAT DIGIT IS REMOVED
POPJ P,
END START